package com.pan.operation.dyproxy.jdk;

import com.pan.operation.dyproxy.ProxyUtil;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * // 设置变量可以保存动态代理类，默认名称以 $Proxy0 格式命名
 * //System.getProperties().setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
 */
public class BossTest {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        // 1. 创建被代理的对象，ISecretary接口的实现类
        FinanceSecretary financeSecretary = new FinanceSecretary();
        // 2. 获取对应的 ClassLoader
        ClassLoader classLoader = financeSecretary.getClass().getClassLoader();
        // 3. 获取所有接口的Class，这里的financeSecretary只实现了一个接口ISecretary
        Class[] interfaces = financeSecretary.getClass().getInterfaces();
        // 4. 创建一个将传给代理类的调用请求处理器，处理所有的代理对象上的方法调用,通过secretaryHelper来增强秘书类，相当于把人放在外骨骼里，得到的增强。
        InvocationHandler secretaryHelper = new SecretaryHelper(financeSecretary);
        /*
		   5.根据上面提供的信息，创建代理对象 在这个过程中，
               a.JDK会通过根据传入的参数信息动态地在内存中创建和.class 文件等同的字节码
               b.然后根据相应的字节码转换成对应的class，
               c.然后调用newInstance()创建代理实例
		 */
        ISecretary proxy = (ISecretary) Proxy.newProxyInstance(classLoader, interfaces, secretaryHelper);
        // 调用代理的方法
        proxy.work();
        // 保存JDK动态代理生成的代理类，类名保存为 UserServiceProxy
        ProxyUtil.generateClassFile(financeSecretary.getClass(), "ISecretaryProxy");
    }
}
